public class code3 {
//    牛客 top101 最长无重复子数组
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int maxLength (int[] arr) {
        // 观察题目，会发现这里的数字有几种不同的，最终返回得到的长度就是几
        // 可以通过两个指针在数组中移动，排除掉重复出现的值，之后两个指针相间的长度就是数组的长度

        // 定义一个 HashMap 用来记录数组中数字重复的情况
        HashMap<Integer, Integer> map = new HashMap<>();

        // 定义一个值用来记录返回值最终的长度
        int re = 0;
        // 定义两个指针
        int left = 0;
        int right = 0;
        // 通过 for 循环实现对数组元素的筛查
        for (int i = 0; i < arr.length; i++) {
            // 让一个指针通过循环向右侧移动
            right = i;
            // 这里判断一下当前位置上的数字是否存在，并且设置对应数字出现的次数
            if (map.containsKey(arr[right])) {
                map.put(arr[right], map.get(arr[right]) + 1);
            } else {
                // 当没有出现过时，此时将这里的值赋值为 1
                map.put(arr[right], 1);
            }
            // 再循环中还需要通过 while 循环确保 left 左指针的向前移动更新
            while (map.get(arr[right]) > 1) {
                map.put(arr[left], map.get(arr[left++]) - 1);
            }
            // 这里还需要不断更新最大值
            re = Math.max(re, right - left + 1);
        }

        return re;
    }
}
